<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 1、function的多面性 function既可以是函数 也可以是对象 还可以是构造函数（类）

        function fn() {
            console.log('123')
        }
        // 当做普通函数使用
        fn();
        //当做对象使用
        console.log(fn.name);//名称 
        // 当做类使用
        let f = new fn();
        console.log(f)
        // 2、作为类使用 获取对象
        // 可以为类设置形成 一旦new实例化对象时候按照形成的顺序逐个赋值
        function Person(name) {
            // 使用this关键字为对象设置属性
            this.name = name
        }

        let p = new Person('张三');
        console.log(p)

        /*

            function Person(name){
                //1、let name = '张三'
                //2、理解为创建了一个对象 类似执行了let obj = new Object;
                //3、可以理解为 let this = obj 
                //4、顺序执行 函数体中的代码
                this.name = name
                //5、返回this对象
            }

            let p= new Person('张三');
            3、new的时候系统做了什么
                a)形参赋值
                b)已当前类名称构造一个对象出来
                c)设置this的指向
                d)顺序执行 函数体中的代码

        */

        // 4、this的指向问题  永远都是谁调用就是谁
        function Human(name) {
            // let name = '常威';
            // let obj = new Object;
            // let this = obj
            this.leg = 2;
            this.name = name;
            this.paly = function () {
                console.log(this.name)
            }
            // 系统自动执行return this  将this对象的内存地址返回 赋值给了p2 所有说 this 谁调用就是谁
        }

        let p2 = new Human('常威');
        p2.paly()
        let p3 = new Human('李四');

    </script>
</body>

</html>